package es.udc.fbellas.j2ee.tiendaweb.model.productofacade.delegate;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.sql.DataSource;

import es.udc.fbellas.j2ee.tiendaweb.model.detallespedido.TO.DetallesPedidoTO;
import es.udc.fbellas.j2ee.tiendaweb.model.direccionpostal.TO.DireccionPostalTO;
import es.udc.fbellas.j2ee.tiendaweb.model.lineapedido.TO.LineaPedidoTO;
import es.udc.fbellas.j2ee.tiendaweb.model.producto.TO.ProductoTO;
import es.udc.fbellas.j2ee.tiendaweb.model.productofacade.TO.PedidoChunkTO;
import es.udc.fbellas.j2ee.tiendaweb.model.productofacade.TO.ProductoChunkTO;
import es.udc.fbellas.j2ee.tiendaweb.model.productofacade.TO.ProductoCustomTO;
import es.udc.fbellas.j2ee.tiendaweb.model.propiedad.TO.PropiedadTO;
import es.udc.fbellas.j2ee.tiendaweb.model.tarjetabancaria.TO.TarjetaBancariaTO;
import es.udc.fbellas.j2ee.tiendaweb.model.util.GlobalNames;
import es.udc.fbellas.j2ee.util.configuration.ConfigurationParametersManager;
import es.udc.fbellas.j2ee.util.configuration.MissingConfigurationParameterException;
import es.udc.fbellas.j2ee.util.exceptions.DuplicateInstanceException;
import es.udc.fbellas.j2ee.util.exceptions.InternalErrorException;
import es.udc.fbellas.j2ee.util.sql.DataSourceLocator;
import es.udc.fbellas.j2ee.util.sql.SimpleDataSource;


/**
 * A factory to get <code>UsuarioFacadeDelegate</code> objects.
 * <p>
 * Required configuration parameters:
 * <ul>
 * <li><code>UsuarioFacadeDelegateFactory/delegateClassName</code>: it must 
 * specify the full class name of the class implementing 
 * <code>UsuarioFacadeDelegate</code>.</li>
 * </ul>
 */
public final class ProductoFacadeDelegateFactory {

    private final static String DELEGATE_CLASS_NAME_PARAMETER =
        "ProductoFacadeDelegateFactory/delegateClassName";

    private static Class delegateClass;
    //private static String usuarioFacadeJNDIName;

    static {

        try {

            /* DELEGATE_CLASS_NAME_PARAMETER is specified in configuration? */        
            String delegateClassName = 
                ConfigurationParametersManager.getParameter(
                    DELEGATE_CLASS_NAME_PARAMETER);
            delegateClass = Class.forName(delegateClassName);
       
        } catch (MissingConfigurationParameterException e) {

            /* 
             * USER_FACADE_JNDI_NAME_PARAMETER should be specificed in
             * configuration.
             */
/*            try {

                userFacadeJNDIName = 
                       ConfigurationParametersManager.getParameter(
                    USER_FACADE_JNDI_NAME_PARAMETER);

            } catch (MissingConfigurationParameterException e2) {

                e.printStackTrace();
                e2.printStackTrace();
            }
*/
        } catch (Exception e) {
            e.printStackTrace();
        }
       

    }
    
    private ProductoFacadeDelegateFactory() {}
    
    
    public static ProductoFacadeDelegate getDelegate() 
        throws InternalErrorException {
        
        try {

//            if (delegateClass != null) {
                return (ProductoFacadeDelegate) delegateClass.newInstance();
/*            } else {
                return ServiceLocator.findService(UserFacadeDelegate.class,
                    userFacadeJNDIName);
            }*/

        } catch (Exception e) {
            throw new InternalErrorException(e);
        }
        
    }
    
    
    
    
      /* Test code. Uncomment for testing. Test this class and any class
     * implementing "UsuarioFacadeDelegate".
     */ 
        
    public static void main (String[] args) {
    
        try {

            /* Create a simple data source. */
            DataSource dataSource = new SimpleDataSource();

            /*
             * Add "dataSource" to "DataSourceLocator"
             * (this is needed to test
             * "es.udc.fbellas.j2ee.miniportal.model.userfacade.plain.
             * PlainUserFacadeDelegate"). 
             */
            DataSourceLocator.addDataSource(GlobalNames.TIENDAWEB_DATA_SOURCE,
                dataSource);
                
            /* Create an "UsuarioFacadeDelegate". */
            ProductoFacadeDelegate delegate =
                ProductoFacadeDelegateFactory.getDelegate();

System.out.println("\n\n\n");
System.out.println("***************************************************************");
System.out.println("*          PRUEBA DE UNIDAD PARA LA FACHADA PRODUCTO          *");
System.out.println("***************************************************************");

			DetallesPedidoTO detallesPedido1;

            /* Test "UsuarioFacadeDelegate::anhadirProducto". */
            System.out.println("\n"+"Test for 'ProductoFacadeDelegate::anhadirProducto'");
			try{
				delegate.anhadirProducto (78453, 6);
				delegate.anhadirProducto (98432, 6);
				delegate.anhadirProducto (98345, 6);			
	            System.out.println("Anhadir Producto" + "\n");
			}catch(InternalErrorException e){
				System.out.println("Not done: No se ha anhadido producto" +"\n");
			}

System.out.println("------------------------------------------------------------------");
	          /* Test "ProductoFacadeDelegate::propiedadesProducto". */
	            System.out.println("\n"+"Test for 'ProductoFacadeDelegate::propiedadesProducto'");
	            List<PropiedadTO> listaPropiedades= new ArrayList<PropiedadTO>();
				try{
					listaPropiedades = delegate.propiedadesProducto(78453);
					Iterator propiedadTOIterator = listaPropiedades.iterator();

			          while (propiedadTOIterator.hasNext()) {
			              PropiedadTO propiedadTO = (PropiedadTO) propiedadTOIterator.next();
			              System.out.println(propiedadTO);
			          }
		            System.out.println("Mostrar Propiedades Producto con id 78453" + "\n");
				}catch(InternalErrorException e){
					System.out.println("Not done: No se pudo modificar numero de unidades" +"\n");
				}
System.out.println("------------------------------------------------------------------");
          /* Test "ProductoFacadeDelegate::modifUnidades". */
            System.out.println("\n"+"Test for 'ProductoFacadeDelegate::modifUnidades'");
			try{
				delegate.modifUnidades(98345,8);			
	            System.out.println("Modificar Unidades Producto" + "\n");
			}catch(InternalErrorException e){
				System.out.println("Not done: No se pudo modificar numero de unidades" +"\n");
			}
System.out.println("------------------------------------------------------------------");                          
      
          /* Test "ProductoFacadeDelegate::eliminarProducto". */
            System.out.println("\n"+"Test for 'ProductoFacadeDelegate::eliminarProducto'");
			try{
				delegate.eliminarProducto(98432);			
	            System.out.println("Eliminado Producto" + "\n");
			}catch(InternalErrorException e){
				System.out.println("Not done: No se pudo eliminar producto" +"\n");
			}
System.out.println("------------------------------------------------------------------");
			/* Test "ProductoFacadeDelegate::visualizarCarrito". */
            System.out.println("\n"+"Test for 'ProductoFacadeDelegate::visualizarCarrito'");
			try{
				System.out.println(delegate.visualizarCarrito());			
			}catch(InternalErrorException e){
				System.out.println("Not done: No se pudo visualizar carrito" +"\n");
			}
System.out.println("------------------------------------------------------------------");
          
          /* Test "ProductoFacadeDelegate::comprarProductos". */
			delegate.anhadirLogin("fbellas");
            System.out.println("\n"+"Test for 'ProductoFacadeDelegate::comprarProductos'");
            DireccionPostalTO dirPostal1;
            TarjetaBancariaTO tarjeta1;
            try{
            	dirPostal1 = new DireccionPostalTO(0, "Fernando", "calle 1", 2, "D",100);
            	tarjeta1 = new TarjetaBancariaTO(5354, java.sql.Date.valueOf("2009-12-12"));
				detallesPedido1 = delegate.comprarProductos(dirPostal1,tarjeta1);
				System.out.println("Pedido hecho" + "\n");
	        }catch(DuplicateInstanceException e){
				System.out.println("Not done: No se pudo hacer pedido" +"\n");
			}
			
System.out.println("------------------------------------------------------------------");
          
			/* Test "ProductoFacadeDelegate::visualizarPedido". */
            System.out.println("\n"+"Test for 'ProductoFacadeDelegate::VisualizarPedido'");
			try{
				PedidoChunkTO p = delegate.visualizarPedido(98543,1,6);		
				System.out.println(p.getDetallesPedidoTO());
				
				
				List<LineaPedidoTO> lineaPedidoTOs = p.getLineaPedidoTOs();
				Iterator lineaTOIterator = lineaPedidoTOs.iterator();

		          while (lineaTOIterator.hasNext()) {
		              LineaPedidoTO lineaPedidoTO = (LineaPedidoTO) lineaTOIterator.next();
		              System.out.println(lineaPedidoTO);
		          }
				System.out.println("----------------------------------------");
				System.out.println("Pedido visualizado" + "\n");
			}catch(InternalErrorException e){
				System.out.println("Not done: No se pudo visualizar pedido" +"\n");
			}

System.out.println("------------------------------------------------------------------");

/* Test "ProductoFacadeDelegate::buscarPorPalabras". */
		System.out.println("\nTest for " +
          "'PedidoProductoFacadeDelegate::buscarPorPalabras'");

			ProductoChunkTO 	p = delegate.buscarPorPalabras("MA",1, 10);
			List<ProductoTO> productoTOs = p.getProductoTOs();
			Iterator productoTOIterator = productoTOs.iterator();

          while (productoTOIterator.hasNext()) {
              ProductoTO productoTO = (ProductoTO) productoTOIterator.next();
              System.out.println(new ProductoCustomTO(productoTO));
          }		
System.out.println("------------------------------------------------------------------");

/* Test "ProductoFacadeDelegate::buscarPorPalabrasYCategoria". */
		System.out.println("\nTest for " +
          "'PedidoProductoFacadeDelegate::buscarPorPalabrasYCategoria'");

			ProductoChunkTO q = delegate.buscarPorPalabrasYCategoria("MA",21342,1, 5);
			List<ProductoTO> productoTO2s = q.getProductoTOs();
			Iterator productoTOIterator2 = productoTO2s.iterator();

          while (productoTOIterator2.hasNext()) {
              ProductoTO productoTO2 = (ProductoTO) productoTOIterator2.next();
              System.out.println(new ProductoCustomTO(productoTO2));
          }


		
System.out.println("------------------------------------------------------------------");
			
			

            /* Tests OK. */
            System.out.println("\t\tTests OK !!!!");

        } catch (Exception e) {
            e.printStackTrace();
        }
        
    }        

}
